/******************************************************/
/***************** 数据库操作相关处理 *****************/
/******************************************************/

const { N, needParam, camelCase } = require("../../core/utils");
const { getAnnoStr } = require("../../core/creator/mysql/_utils");
const { createTable, insertTable, deleteTable, updateTable, selectTable } = require("../../core/creator/mysql");
const { designEasyNoteMap } = require(".");

/**
 * 生成创建表格的sql语句
 * @param {string} tableName 表名称
 * @param {string} indexNames  索引字段名称
 * @param {any[][]} addRows 要插入的数据
 * @param {boolean} isOver 是否覆盖表（删除旧表，创建新表）
 * @returns
 */
function getCreateTableSql(tableName = needParam(), indexNames, addRows = [], isOver = false) {
  let sqlStr = "";
  const createSql = createTable(tableName, isOver);
  sqlStr = `${getAnnoStr(`${isOver ? "覆盖" : "创建"}${tableName}表${N}${createSql}`)}${N}`;
  // 创建唯一索引键
  if (indexNames?.length) {
    // ALTER TABLE operate_status ADD UNIQUE INDEX uk_create_id_type (create_id, type);
    const ukName = "uk_" + indexNames.map(it => camelCase(it)).join("_"); // uk_createId_type
    sqlStr += `ALTER TABLE ${tableName} ADD UNIQUE INDEX ${ukName} (${indexNames.join(", ")});`;
  }
  if (addRows?.length) {
    const insertSql = insertTable(tableName, addRows);
    sqlStr += `${N}${getAnnoStr(`插入${tableName}表${N}${insertSql}`)}${N}`;
  }
  // if (tableName === "user") {
  //   function getFrontStr(type = "处理") {
  //     return `${N}${N}-- ${type}${tableName}表${N}`;
  //   }
  //   /*** 插入表 ***/
  //   sqlStr +=
  //     getFrontStr("插入") +
  //     insertTable(
  //       tableName,
  //       [
  //         ["userName", "gender"],
  //         ["唐六", 1],
  //         ["程八", 2],
  //       ],
  //     );
  //   /*** 删除表 ***/
  //   sqlStr += getFrontStr("删除") + deleteTable(tableName, {where: {id: 5});
  //   sqlStr += getFrontStr("删除") + deleteTable(tableName, {where: { id: 6, user_name: "李四", age|>: "20" }});
  //   /*** 修改表 ***/
  //   sqlStr += getFrontStr("修改") + updateTable(tableName, { gender: 2 }, {where: { user_name: "李四" }});
  //   /*** 查找表 ***/
  //   // 单表查询
  //   sqlStr += getFrontStr("查找") + selectTable({[tableName]: undefined}, {where:{ user_name: "李四", age|>=: "20" }});
  //   sqlStr += getFrontStr("查找") + selectTable({[tableName]: ['*']}, {where:{ user_name: ["李四", "张三"] }});
  //   // 模糊查询
  //   sqlStr += getFrontStr("查找") + selectTable({[tableName]: ['*']}, {where:{ user_name|like: "%四%"}}); // 名字中含有四
  //   // 正则表达式查询
  //   sqlStr += getFrontStr("查找") + selectTable({[tableName]: ['*']}, {where:{ user_name|regexp: "^李.+" }}); // 姓李的
  //   // 取反查询
  //   sqlStr += getFrontStr("查找") + selectTable({[tableName]: ['*']}, {where:[{ "user_name|not": ["李四", "张三"], "age|!=": "24" }, { user_name: "王五" }]});
  //   // 多表查询(order:默认 INNER 连接，log LEFT连接)
  //   sqlStr += getFrontStr("查找") +  selectTable({ user: ["id", "user_name", "nickname", "age"], order: ["user_id", "price", "amount"], "log|left": ["user_id"] }, { "user.age|>": "20", "order.price|>=": "20" });
  // }
  return sqlStr;
}

module.exports = {
  // 获取创建所有表的sql语句字符串
  getCreateTablesSqlStr(tablesMap = designEasyNoteMap, isInsert = false, isOver = false) {
    let sqlStr = N;
    // 创建表、插入初始数据
    const names = Object.keys(tablesMap);
    names.forEach((name, ind) => {
      const { fields, indexNames, insertRows = [] } = tablesMap[name];
      const str = getCreateTableSql(name, indexNames, isInsert ? insertRows : undefined, isOver);
      const isLast = ind === names.length - 1;
      sqlStr += `${str}${isLast ? "" : `${N}${N}${N}`}`;
    });
    return sqlStr;
  },
};
